Node(服务端)常用npm包

2019.5.20 星期一

fse: https://github.com/jprichardson/node-fs-extra
rimraf: https://github.com/isaacs/rimraf#readme
nodemon: https://github.com/remy/nodemon

Q:
因为Javascript的异步机制,使得写出来的程序往往是一层一层的callback嵌套,代码的可读性和维护性都很差. 而Promise的出现使得我们可以更加直观简洁的去处理异步编程.

const glob = require(‘glob’)
const download = require(‘download’)
const rimraf = require(‘rimraf’)
const ProgressBar = require(‘progress’)

网络请求

http,request,axios等
当时只是做一个图片下载和上传(cdn),尝试找php中curl发现并不需要。只是网络请求就可以了。
上传图片的时候,只是因为格式不对,和接口定义的不一致,需要上传表格类型数据

\$NOTE: 在用pipe传递流的时候,需要注意监听error,而且要在pipe之前。否则error没有handle,就会出错,导致这个进程结束。

1
2
3
4
5
6
7
8
9
request(imgUrl,{timeout:2000})
.on('error',function(err){ // $PS: 需要写在pipe前面监听error
console.log('request图片失败err:',err.code)
return reject(err)
})
.pipe(fs.createWriteStream('image-temp.jpg'))
.on('finish', function () {

})

request上传表单

request:https://github.com/request/request#forms
For multipart/form-data we use the form-data library by @felixge. For the most cases, you can pass your upload form data via the formData option.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
request.post('http://service.com/upload', {form:{key:'value'}})
request.post('http://service.com/upload').form({key:'value'})
// ## form-data
const form = r.form();
form.append('my_field', 'my_value');


const formData = {
my_field: 'my_value',
my_buffer: Buffer.from([1, 2, 3]),
my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
attachments: [
fs.createReadStream(__dirname + '/attachment1.jpg'),
fs.createReadStream(__dirname + '/attachment2.jpg')
],
custom_file: {
value: fs.createReadStream('/dev/urandom'),
options: {
filename: 'topsecret.jpg',
contentType: 'image/jpeg'
}
}
};
request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body){
if (err) {
return console.error('upload failed:', err);
}
console.log('Upload successful! Server responded with:', body);
});

参考

1
2
3
4
5
6
7
fs.createReadStream(filePath).pipe(request.put(putURL,options,function(err, httpsResponse, body){
if ( err ) {
console.log('err', err);
} else {
console.log(body);
}
}));

curl

弃用,非正道

日志

详细介绍不同的Node.js日志工具
在这篇文章中,我们将比较Node.js的不同日志工具,包括:

  • Bunyan
  • Winston
  • Pino
  • Morgan
  • npmlog

Bunyan
Bunyan是Node.js中一个非常流行的日志工具。它是一个简单而快速的Node.js服务的JSON日志库,提供了一个漂亮的日志CLI视图,用不同的颜色描述不同的日志级别。

Morgan
Morgan是一个Node.js库,用于记录HTTP请求。它通常被作为一个中间件加入,这样它就可以跟踪所有的请求。与其他日志工具不同,它的主要功能是记录HTTP请求。

npmlog
这是npm使用的官方日志工具。就像其他Node.js日志库一样,它支持自定义级别,彩色输出,并让你有能力为你的不同日志级别设置不同的颜色。

图片处理

gm功能强大,node-images使用简单;两者都需要安装GraphicsMagick或者ImageMagick;实际通过安装GraphicsMagick成功的
\$_PS: 安装完记得配置环境变量

# nodejs图片裁剪、缩放、水印
关于nodejs下图片的裁剪、水印,网上的模块很多,主要如下:
gm:https://github.com/aheckmann/gm
node-canvas:https://github.com/Automattic/node-canvas
node-images:https://github.com/zhangyuanwei/node-images
Cloudinary:http://cloudinary.com/documentation/node_image_manipulation

这里推荐使用gm模块,首先是安装:
先要安装GraphicsMagick或者ImageMagick,因为gm是基于这两种图形处理工具包的。

web server

  1. Node.js Express

  2. KOA
    KOA 框架的核心是 ES6 的 generator。

  3. Hapi
    Hapi 是为数不多的不依赖于 Express 的 node.js 框架,现在甚至已经完全独立于 Express 了。
    很多开发者选择了 Hapi 而非 Express,这使得它或多或少变为了 Express 的竞争对手。
    $_PS: qps 等优

  1. Sails.js (node.js mvc)
    Sails.js 在底层使用了 express框架来提供对 http 请求的处理,同时使用 Socket.IO 框架来处理WebSocket 请求。同时作为一个前端应用开发框架,它允许开发人员选择他/她熟悉的技术来开发应用。

  2. Flatiron.js (Node.js MVC 框架)

  3. Derby.js
    Derby.JS 跟它的直接竞争对手 Meteor、Mean.io、以及 Mojito 一样,也是一个全栈框架。

  4. Mean.IO
    Mean 是 Mongo DB,Express,Angular 和 Node.js 捆绑在一起的组合。基本上说只要有它,你就拥有了数据库层,服务器端和网页前端的整套工具,足以开发所有类型的现代网络应用。
  5. Meteor
    所有的流程都是无缝连接,开箱即用。整个框架使用统一的 API,Meteor API 同时适用于客户端和服务器端。
  6. Mojito
    Mojito 由 Yahoo 开发并迅速取得成功。然而很快又带着关于框架的空前的成功坐到了冷板凳,就像Meteor 和 Mean stack 那样。

  7. Socket Stream
    SocketStream 是一个有趣的框架,专注于客户端和服务端数据的快速同步,它致力于前后端数据的实时更新。
    它最大的特点是不严格要求你使用指定的客户端技术,也不限定数据库的 ORM。我趋向于将它和有同样功能的兄弟项目 Sail.js 做比较

$_PS: 上面怎么没有egg.js

框架对比

# [Node.js主流Web框架对比]
主要参考的Node.js Web框架包括:express, koa, hapi, restify, fastify, eggjs, thinkjs, Sails, Adonisjs, NestJS。

express,koa,hapi,egg 对比

  1. express
    缺点:
    使用Express需要手动处理很多单调乏味的任务。它没有内置的错误处理。当你需要解决某个特定的问题的时候,你会容易迷失在众多可以添加的中间件中,在Express中,你有太多方式去解决同一个问题。Express自诩为高度可配置,这有好处也有坏处,对于准备使用Express的刚入门的开发者来说,这不是一件好的事情。并且对比起其他框架来说,Express体积更大。

  2. Koa
    缺点:Koa有缺点吗?

  3. hapi
    Hapi自豪地宣称它自己是基于配置优于编码的概念,并且很多开发者认为这是一件好事。

缺点:
Hapi绝逼适合用来开发更大更复杂的应用。但对于一个简单的web app来说,它的可能有点儿堆砌太多样板代码了。而且Hapi的可供参考样例太少了,或者说开源的使用Hapi的应用程序太少了。所以选择它对开发者的要求更高一点,而不是所使用的中间件。

  1. egg
    Egg.js 是阿里开源的企业级框架,旨在帮助开发团队和开发人员降低开发和维护成本。

egg继承于koa,而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。

其他:

数据库

mysql

mysql https://npmjs.org/package/mysql

对比

mysql https://npmjs.org/package/mysql
mysql-libmysqlclient https://npmjs.org/package/mysql-libmysqlclient
mysql-native https://npmjs.org/package/mysql-native

最后更新时间
mysql last updated a month ago
mysql-libmysqlclient last updated 25 days ago
mysql-native last updated 7 months ago

上个月下载次数
mysql 29 323
mysql-libmysqlclient 1 026
mysql-native 334

项目维护人数
mysql 5人
mysql-libmysqlclient 1人
mysql-native 1人

依赖其的项目
mysql 104
mysql-libmysqlclient 10
mysql-native 0

knowledge is no pay,reward is kindness
0%